package com.jprocms.module.cms.convert.sitetpl;

import cn.hutool.core.collection.CollUtil;
import com.jpro.framework.common.pojo.PageResult;
import com.jprocms.module.cms.api.dto.SiteDefTplDto;
import com.jprocms.module.cms.api.vo.SiteDefTplVO;
import com.jprocms.module.cms.controller.admin.sitetpl.vo.*;
import com.jprocms.module.cms.dal.dataobject.sitetpl.SiteTplDO;
import com.jprocms.module.cms.service.sitetpl.IResFile;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import static com.jprocms.module.cms.constant.CmsSysConstants.SUFFIX;

/**
 * 站点各个发布平台的首页和列表默认模板 Convert
 *
 * @author jprocms
 */
@Mapper
public interface SiteTplConvert {

    SiteTplConvert INSTANCE = Mappers.getMapper(SiteTplConvert.class);

    SiteTplDO convert(SiteTplCreateReqVO bean);

    SiteTplDO convert(SiteDefTplDto bean);


    SiteDefTplVO convert(SiteTplDO bean);

    default SiteDefTplVO joinSuffixConvert(SiteTplDO bean) {
        SiteDefTplVO tplVO = convert(bean);
        String indexTpl = tplVO.getIndexTpl();
        if (StringUtils.hasText(indexTpl)) {
            indexTpl = indexTpl + SUFFIX;
        }
        tplVO.setIndexTpl(indexTpl);
        String defListTpl = tplVO.getDefListTpl();
        if (StringUtils.hasText(defListTpl)) {
            defListTpl = defListTpl + SUFFIX;
        }
        tplVO.setDefListTpl(defListTpl);
        return tplVO;
    }

    SiteTplDO convert(SiteTplUpdateReqVO bean);

    List<SiteTplRespVO> convertList(List<SiteTplDO> list);

    PageResult<SiteTplRespVO> convertPage(PageResult<SiteTplDO> page);

    List<SiteTplExcelVO> convertList02(List<SiteTplDO> list);


    SiteTplListVo convertTplRes(IResFile resFile);

    SiteTplTreeVo convertTplResForTree(IResFile resFile);

    default List<SiteTplListVo> convertTplResList(List<IResFile> list) {
        if (CollUtil.isEmpty(list)) {
            return Collections.emptyList();
        }
        List<SiteTplListVo> vos = new ArrayList<>();
        list.stream().forEach((vo) -> {
            SiteTplListVo toaddVo = convertTplRes(vo);
            vos.add(toaddVo);
        });
        return vos;
    }

    default List<SiteTplTreeVo> convertTplResTree(List<SiteTplTreeVo> container, List<IResFile> list) {
        if (CollUtil.isEmpty(list)) {
            return Collections.emptyList();
        }
        List<SiteTplTreeVo> vos = new ArrayList<>();
        list.stream().forEach((vo) -> {
            vo.setChildren(vo.getAllChildren());
            SiteTplTreeVo toaddVo = convertTplResForTree(vo);
            vos.add(toaddVo);
        });
        //全部展开节点，前端需要
        for (SiteTplTreeVo vo : vos) {
            tileChildToContainer(container, vo);
        }
        return container;
    }

    default List<SiteTplTreeVo> tileChildToContainer(List<SiteTplTreeVo> container, SiteTplTreeVo siteTplTreeVo) {
        container.add(siteTplTreeVo);
        if (CollUtil.isEmpty(siteTplTreeVo.getChildren())) {
            return container;
        }
        for (SiteTplTreeVo child : siteTplTreeVo.getChildren()) {
            tileChildToContainer(container, child);
        }
        return container;
    }

}
